package jee.boot.entity.task;

import jee.boot.common.utils.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Excel工具类
 */
public class ExcelUtils {
    /**
     * excel中列字符转换成对应的列位置
     * <pre>
     *  toExcelIndex("A") = 0
     *  toExcelIndex("AA") = 26
     *  </pre>
     *
     * @param column
     * @return
     */
    public static int toExcelIndex(String column) {
        column = StringUtils.upperCase(column);
        int index = 0;
        char[] chars = column.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            index += ((int) chars[i] - (int) 'A' + 1) * (int) Math.pow(26, chars.length - i - 1);
        }
        return index - 1;

    }

    /**
     * excel中列位置转换成对应的列字符
     * <pre>
     *  toExcelName(0) = "A"
     *  toExcelName(26) = "AA"
     *  </pre>
     *
     * @param index
     * @return
     */
    public static String toExcelName(int index) {
        List<String> chars = new ArrayList<>();
        do {
            if (chars.size() > 0)
                index--;
            chars.add(0, "" + ((char) (index % 26 + (int) 'A')));
            index = (int) ((index - index % 26) / 26);
        } while (index > 0);
        return StringUtils.join(chars, "");
    }

    /**
     * 根据坐标返回对应excel中的数据
     *
     * @param excelData  excel数据
     * @param columnName 列坐标,比如"A","B","AB"等
     * @param rowIndex   行坐标,比如第1行,(从1开始)
     * @param <T>        返回数据的类型
     * @return 比如坐标为 "A",12 就会返回对应单元格的数据
     */
    public static <T> T getValue(Map<String, Object> excelData, String columnName, int rowIndex) {
        String key = columnName +"_"+ rowIndex;

        return getValue(excelData, key);
    }

    /**
     * 根据坐标返回对应excel中的数据
     *
     * @param excelData excel数据
     * @param key       列坐标,比如"A_1","B_2","AB_13"等
     * @param <T>       返回数据的类型
     * @return 比如坐标为 "A",12 就会返回对应单元格的数据
     */
    public static <T> T getValue(Map<String, Object> excelData, String key) {
        if (excelData != null && !excelData.isEmpty()) {
            if (excelData.containsKey(key)) {
                return (T) excelData.get(key);
            }
        }
        return null;
    }
}


